package com.sunrise.estoque.repositorio;

import java.util.Collection;
import java.util.List;

import org.hibernate.Criteria;
import org.hibernate.criterion.MatchMode;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Restrictions;
import org.springframework.stereotype.Repository;

import com.sunrise.estoque.repositorio.iface.ProdutoDao;
import com.sunrise.generico.acesso.DaoService;
import com.sunrise.generico.entidade.Produto;
import com.sunrise.generico.visao.Filtro;

@Repository
public class ProdutoDaoImpl extends DaoService<Produto> implements ProdutoDao {

	public List<Produto> listarOrdenado() {
		return listar(Produto.class);
	}

	public Produto getById(Long id) {
		return getById(id, Produto.class);
	}

	@SuppressWarnings("unchecked")
	@Override
	public List<Produto> buscarProdutosPorCodigoOuNome(Produto produtoFiltro) {
		Criteria crit = getSession().createCriteria(Produto.class);

		if (produtoFiltro.getNome() != null && produtoFiltro.getId() != null) {
			crit.add(Restrictions.or(Restrictions.ilike("nome", produtoFiltro.getNome(), MatchMode.ANYWHERE),
					Restrictions.eq("id", produtoFiltro.getId())));

		} else if (produtoFiltro.getNome() != null) {
			crit.add(Restrictions.ilike("nome", produtoFiltro.getNome(), MatchMode.ANYWHERE));

		} else if (produtoFiltro.getId() != null && produtoFiltro.getId() != 0) {
			crit.add(Restrictions.eq("id", produtoFiltro.getId()));
		}

		crit.add(Restrictions.eq("ativo", Boolean.TRUE));
		return crit.list();
	}

	@SuppressWarnings("unchecked")
	@Override
	public List<Produto> listarPorNome(String nome) {
		Criteria crit = getSession().createCriteria(Produto.class);
		crit.add(Restrictions.ilike("nome", nome, MatchMode.ANYWHERE));
		crit.addOrder(Order.asc("nome"));
		return crit.list();
	}

	@Override
	public Produto buscarPorNome(String nome) {
		Criteria crit = getSession().createCriteria(Produto.class);
		crit.add(Restrictions.eq("nome", nome).ignoreCase());
		return (Produto) crit.uniqueResult();
	}

	@Override
	public Produto buscarPorCodigoBarras(String cean) {
		Criteria crit = getSession().createCriteria(Produto.class);
		crit.add(Restrictions.eq("cEAN", cean).ignoreCase());
		return (Produto) crit.uniqueResult();
	}

	
	@SuppressWarnings("unchecked")
	@Override
	public Collection<Produto> buscarPorFiltro(Filtro filtro) {
		Criteria crit = getSession().createCriteria(Produto.class);

		if(filtro.getNome() != null && !filtro.getNome().isEmpty()){
			crit.add(Restrictions.ilike("nome", filtro.getNome(), MatchMode.ANYWHERE));
		}
		
		if(filtro.getAtivo() != null){
			crit.add(Restrictions.eq("ativo", filtro.getAtivo().getCodigo()));
		}
		
		if(filtro.getId() != null && filtro.getId() != 0){
			crit.add(Restrictions.eq("id", filtro.getId()));
		}

		if(filtro.getCodigoFornecedor() != null && !filtro.getCodigoFornecedor().isEmpty()){
			crit.add(Restrictions.eq("codigoFornecedor", filtro.getCodigoFornecedor()));
		}
		
		crit.addOrder(Order.asc("nome"));
		return crit.list();
	}

}
